package cn.lg.soar.common.model;

import cn.lg.soar.common.util.PojoUtil;
import cn.lg.soar.common.util.jackson.serializer.LongToNumberSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.List;
import java.util.function.BiFunction;

/**
 * 分页
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
@Getter
@Setter
@Accessors(chain = true)
@ApiModel(value = "分页结果", description = "分页结果")
public class PageResult<T> extends PageQuery implements IPageQuery{

    @JsonSerialize(using= LongToNumberSerializer.class)
    @ApiModelProperty(value = "总记录数")
    private Long total;

    @ApiModelProperty(value = "数据列表")
    private List<T> list;

    public PageResult() { }

    public PageResult(Long total, List<T> list) {
        this.total = total;
        this.list = list;
    }

    /**
     * 转换结果
     * @param eClass 目标类型
     * @return
     * @param <E>
     */
    public <E>PageResult<E> convert(Class<E> eClass) {
        return copy(
                PojoUtil.copyToList(list, eClass)
        );
    }

    /**
     * 转换结果
     * @param eClass 目标类型
     * @param handler 后置处理器
     * @return
     * @param <E>
     */
    public <E>PageResult<E> convert(Class<E> eClass, BiFunction<T, E, E> handler) {
        return copy(
                PojoUtil.copyToList(list, eClass, handler)
        );
    }

    /**
     * 转换结果
     * @param eClass 目标类型
     * @param ignoreFields 要忽略的字段“,”隔开，（忽略的字段不会复制）
     * @return
     * @param <E>
     */
    public <E>PageResult<E> convert(Class<E> eClass, String ignoreFields) {
        return copy(
                PojoUtil.copyToList(list, eClass, ignoreFields)
        );
    }

    /**
     * 转换结果
     * @param eClass 目标类型
     * @param handler 后置处理器
     * @param ignoreFields 要忽略的字段“,”隔开，（忽略的字段不会复制）
     * @return
     * @param <E>
     */
    public <E>PageResult<E> convert(Class<E> eClass, String ignoreFields, BiFunction<T, E, E> handler) {
        return copy(
                PojoUtil.copyToList(list, eClass, ignoreFields, handler)
        );
    }

    private <E>PageResult<E> copy(List<E> list) {
        PageResult<E> pageResult = new PageResult<>();
        pageResult.setPageNo(getPageNo());
        pageResult.setPageSize(getPageSize());
        pageResult.setQueryType(getQueryType());
        pageResult.setTotal(total);
        pageResult.setList(list);
        return pageResult;
    }
}
